<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Voro++: container.hh Source File</title>

<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />



</head>
<body>
<div id="top"><!-- do not remove this div! -->


<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  
  
  <td style="padding-left: 0.5em;">
   <div id="projectname">Voro++
   
   </div>
   
  </td>
  
  
  
 </tr>
 </tbody>
</table>
</div>

<!-- Generated by Doxygen 1.7.5.1 -->
<script type="text/javascript" src="dynsections.js"></script>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>Globals</span></a></li>
    </ul>
  </div>
<div class="header">
  <div class="headertitle">
<div class="title">container.hh</div>  </div>
</div>
<div class="contents">
<a href="container_8hh.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// Voro++, a 3D cell-based Voronoi library</span>
<a name="l00002"></a>00002 <span class="comment">//</span>
<a name="l00003"></a>00003 <span class="comment">// Author   : Chris H. Rycroft (LBL / UC Berkeley)</span>
<a name="l00004"></a>00004 <span class="comment">// Email    : chr@alum.mit.edu</span>
<a name="l00005"></a>00005 <span class="comment">// Date     : August 30th 2011</span>
<a name="l00006"></a>00006 <span class="comment"></span>
<a name="l00007"></a>00007 <span class="comment">/** \file container.hh</span>
<a name="l00008"></a>00008 <span class="comment"> * \brief Header file for the container_base and related classes. */</span>
<a name="l00009"></a>00009 
<a name="l00010"></a>00010 <span class="preprocessor">#ifndef VOROPP_CONTAINER_HH</span>
<a name="l00011"></a>00011 <span class="preprocessor"></span><span class="preprocessor">#define VOROPP_CONTAINER_HH</span>
<a name="l00012"></a>00012 <span class="preprocessor"></span>
<a name="l00013"></a>00013 <span class="preprocessor">#include &lt;cstdio&gt;</span>
<a name="l00014"></a>00014 <span class="preprocessor">#include &lt;cstdlib&gt;</span>
<a name="l00015"></a>00015 <span class="preprocessor">#include &lt;cmath&gt;</span>
<a name="l00016"></a>00016 <span class="preprocessor">#include &lt;vector&gt;</span>
<a name="l00017"></a>00017 <span class="keyword">using namespace </span>std;
<a name="l00018"></a>00018 
<a name="l00019"></a>00019 <span class="preprocessor">#include &quot;<a class="code" href="config_8hh.html" title="Master configuration file for setting various compile-time options.">config.hh</a>&quot;</span>
<a name="l00020"></a>00020 <span class="preprocessor">#include &quot;<a class="code" href="common_8hh.html" title="Header file for the small helper functions.">common.hh</a>&quot;</span>
<a name="l00021"></a>00021 <span class="preprocessor">#include &quot;<a class="code" href="v__base_8hh.html" title="Header file for the base Voronoi container class.">v_base.hh</a>&quot;</span>
<a name="l00022"></a>00022 <span class="preprocessor">#include &quot;<a class="code" href="cell_8hh.html" title="Header file for the voronoicell and related classes.">cell.hh</a>&quot;</span>
<a name="l00023"></a>00023 <span class="preprocessor">#include &quot;<a class="code" href="c__loops_8hh.html" title="Header file for the loop classes.">c_loops.hh</a>&quot;</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include &quot;<a class="code" href="v__compute_8hh.html" title="Header file for the voro_compute template and related classes.">v_compute.hh</a>&quot;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &quot;<a class="code" href="rad__option_8hh.html" title="Header file for the classes encapsulating functionality for the regular and radical Voronoi tessellat...">rad_option.hh</a>&quot;</span>
<a name="l00026"></a>00026 
<a name="l00027"></a>00027 <span class="keyword">namespace </span>voro {
<a name="l00028"></a>00028 <span class="comment"></span>
<a name="l00029"></a>00029 <span class="comment">/** \brief Pure virtual class from which wall objects are derived.</span>
<a name="l00030"></a>00030 <span class="comment"> *</span>
<a name="l00031"></a>00031 <span class="comment"> * This is a pure virtual class for a generic wall object. A wall object</span>
<a name="l00032"></a>00032 <span class="comment"> * can be specified by deriving a new class from this and specifying the</span>
<a name="l00033"></a>00033 <span class="comment"> * functions.*/</span>
<a name="l00034"></a><a class="code" href="classvoro_1_1wall.html">00034</a> <span class="keyword">class </span><a class="code" href="classvoro_1_1wall.html" title="Pure virtual class from which wall objects are derived.">wall</a> {
<a name="l00035"></a>00035         <span class="keyword">public</span>:
<a name="l00036"></a>00036                 <span class="keyword">virtual</span> ~<a class="code" href="classvoro_1_1wall.html" title="Pure virtual class from which wall objects are derived.">wall</a>() {}<span class="comment"></span>
<a name="l00037"></a>00037 <span class="comment">                /** A pure virtual function for testing whether a point is</span>
<a name="l00038"></a>00038 <span class="comment">                 * inside the wall object. */</span>
<a name="l00039"></a>00039                 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> point_inside(<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z) = 0;<span class="comment"></span>
<a name="l00040"></a>00040 <span class="comment">                /** A pure virtual function for cutting a cell without</span>
<a name="l00041"></a>00041 <span class="comment">                 * neighbor-tracking with a wall. */</span>
<a name="l00042"></a>00042                 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> cut_cell(<a class="code" href="classvoro_1_1voronoicell.html" title="Extension of the voronoicell_base class to represent a Voronoi cell without neighbor information...">voronoicell</a> &amp;c,<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z) = 0;<span class="comment"></span>
<a name="l00043"></a>00043 <span class="comment">                /** A pure virtual function for cutting a cell with</span>
<a name="l00044"></a>00044 <span class="comment">                 * neighbor-tracking enabled with a wall. */</span>
<a name="l00045"></a>00045                 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> cut_cell(<a class="code" href="classvoro_1_1voronoicell__neighbor.html" title="Extension of the voronoicell_base class to represent a Voronoi cell with neighbor information...">voronoicell_neighbor</a> &amp;c,<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z) = 0;
<a name="l00046"></a>00046 };
<a name="l00047"></a>00047 <span class="comment"></span>
<a name="l00048"></a>00048 <span class="comment">/** \brief A class for storing a list of pointers to walls.</span>
<a name="l00049"></a>00049 <span class="comment"> *</span>
<a name="l00050"></a>00050 <span class="comment"> * This class stores a list of pointers to wall classes. It contains several</span>
<a name="l00051"></a>00051 <span class="comment"> * simple routines that make use of the wall classes (such as telling whether a</span>
<a name="l00052"></a>00052 <span class="comment"> * given position is inside all of the walls or not). It can be used by itself,</span>
<a name="l00053"></a>00053 <span class="comment"> * but also forms part of container_base, for associating walls with this</span>
<a name="l00054"></a>00054 <span class="comment"> * class. */</span>
<a name="l00055"></a><a class="code" href="classvoro_1_1wall__list.html">00055</a> <span class="keyword">class </span><a class="code" href="classvoro_1_1wall__list.html" title="A class for storing a list of pointers to walls.">wall_list</a> {
<a name="l00056"></a>00056         <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00057"></a>00057 <span class="comment">                /** An array holding pointers to wall objects. */</span>
<a name="l00058"></a><a class="code" href="classvoro_1_1wall__list.html#abfc54768de5b596237d7eef5f589fe90">00058</a>                 <a class="code" href="classvoro_1_1wall.html" title="Pure virtual class from which wall objects are derived.">wall</a> **<a class="code" href="classvoro_1_1wall__list.html#abfc54768de5b596237d7eef5f589fe90">walls</a>;<span class="comment"></span>
<a name="l00059"></a>00059 <span class="comment">                /** A pointer to the next free position to add a wall pointer.</span>
<a name="l00060"></a>00060 <span class="comment">                 */</span>
<a name="l00061"></a><a class="code" href="classvoro_1_1wall__list.html#abb48a3e29042c51cf48fa6a6b6c2dc1d">00061</a>                 <a class="code" href="classvoro_1_1wall.html" title="Pure virtual class from which wall objects are derived.">wall</a> **<a class="code" href="classvoro_1_1wall__list.html#abb48a3e29042c51cf48fa6a6b6c2dc1d">wep</a>;
<a name="l00062"></a>00062                 <a class="code" href="classvoro_1_1wall__list.html" title="A class for storing a list of pointers to walls.">wall_list</a>();
<a name="l00063"></a>00063                 ~<a class="code" href="classvoro_1_1wall__list.html" title="A class for storing a list of pointers to walls.">wall_list</a>();<span class="comment"></span>
<a name="l00064"></a>00064 <span class="comment">                /** Adds a wall to the list.</span>
<a name="l00065"></a>00065 <span class="comment">                 * \param[in] w the wall to add. */</span>
<a name="l00066"></a><a class="code" href="classvoro_1_1wall__list.html#aca50327f246b61f6aeef5337327d957d">00066</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1wall__list.html#aca50327f246b61f6aeef5337327d957d">add_wall</a>(<a class="code" href="classvoro_1_1wall.html" title="Pure virtual class from which wall objects are derived.">wall</a> *w) {
<a name="l00067"></a>00067                         <span class="keywordflow">if</span>(wep==wel) increase_wall_memory();
<a name="l00068"></a>00068                         *(wep++)=w;
<a name="l00069"></a>00069                 }<span class="comment"></span>
<a name="l00070"></a>00070 <span class="comment">                /** Adds a wall to the list.</span>
<a name="l00071"></a>00071 <span class="comment">                 * \param[in] w a reference to the wall to add. */</span>
<a name="l00072"></a><a class="code" href="classvoro_1_1wall__list.html#a8e3a5253fa0392bf0f8b7a84eb1b61d4">00072</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1wall__list.html#a8e3a5253fa0392bf0f8b7a84eb1b61d4">add_wall</a>(<a class="code" href="classvoro_1_1wall.html" title="Pure virtual class from which wall objects are derived.">wall</a> &amp;w) {<a class="code" href="classvoro_1_1wall__list.html#a8e3a5253fa0392bf0f8b7a84eb1b61d4">add_wall</a>(&amp;w);}
<a name="l00073"></a>00073                 <span class="keywordtype">void</span> add_wall(<a class="code" href="classvoro_1_1wall__list.html" title="A class for storing a list of pointers to walls.">wall_list</a> &amp;wl);<span class="comment"></span>
<a name="l00074"></a>00074 <span class="comment">                /** Determines whether a given position is inside all of the</span>
<a name="l00075"></a>00075 <span class="comment">                 * walls on the list.</span>
<a name="l00076"></a>00076 <span class="comment">                 * \param[in] (x,y,z) the position to test.</span>
<a name="l00077"></a>00077 <span class="comment">                 * \return True if it is inside, false if it is outside. */</span>
<a name="l00078"></a><a class="code" href="classvoro_1_1wall__list.html#ae6d83d60ffa99fb6712445616883d1c8">00078</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1wall__list.html#ae6d83d60ffa99fb6712445616883d1c8">point_inside_walls</a>(<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z) {
<a name="l00079"></a>00079                         <span class="keywordflow">for</span>(<a class="code" href="classvoro_1_1wall.html" title="Pure virtual class from which wall objects are derived.">wall</a> **wp=walls;wp&lt;wep;wp++) <span class="keywordflow">if</span>(!((*wp)-&gt;point_inside(x,y,z))) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00080"></a>00080                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00081"></a>00081                 }<span class="comment"></span>
<a name="l00082"></a>00082 <span class="comment">                /** Cuts a Voronoi cell by all of the walls currently on</span>
<a name="l00083"></a>00083 <span class="comment">                 * the list.</span>
<a name="l00084"></a>00084 <span class="comment">                 * \param[in] c a reference to the Voronoi cell class.</span>
<a name="l00085"></a>00085 <span class="comment">                 * \param[in] (x,y,z) the position of the cell.</span>
<a name="l00086"></a>00086 <span class="comment">                 * \return True if the cell still exists, false if the cell is</span>
<a name="l00087"></a>00087 <span class="comment">                 * deleted. */</span>
<a name="l00088"></a>00088                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_<span class="keyword">class</span>&gt;
<a name="l00089"></a><a class="code" href="classvoro_1_1wall__list.html#ae3d367bca20c8d5714e2978ed67fe019">00089</a>                 <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1wall__list.html#ae3d367bca20c8d5714e2978ed67fe019">apply_walls</a>(c_class &amp;c,<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z) {
<a name="l00090"></a>00090                         <span class="keywordflow">for</span>(<a class="code" href="classvoro_1_1wall.html" title="Pure virtual class from which wall objects are derived.">wall</a> **wp=walls;wp&lt;wep;wp++) <span class="keywordflow">if</span>(!((*wp)-&gt;cut_cell(c,x,y,z))) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00091"></a>00091                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00092"></a>00092                 }
<a name="l00093"></a>00093                 <span class="keywordtype">void</span> deallocate();
<a name="l00094"></a>00094         <span class="keyword">protected</span>:
<a name="l00095"></a>00095                 <span class="keywordtype">void</span> increase_wall_memory();<span class="comment"></span>
<a name="l00096"></a>00096 <span class="comment">                /** A pointer to the limit of the walls array, used to</span>
<a name="l00097"></a>00097 <span class="comment">                 * determine when array is full. */</span>
<a name="l00098"></a><a class="code" href="classvoro_1_1wall__list.html#a292491bc99b6bbc819bb3720fcfb08a1">00098</a>                 <a class="code" href="classvoro_1_1wall.html" title="Pure virtual class from which wall objects are derived.">wall</a> **<a class="code" href="classvoro_1_1wall__list.html#a292491bc99b6bbc819bb3720fcfb08a1">wel</a>;<span class="comment"></span>
<a name="l00099"></a>00099 <span class="comment">                /** The current amount of memory allocated for walls. */</span>
<a name="l00100"></a><a class="code" href="classvoro_1_1wall__list.html#a8a06b6562bbf488ff30852cd1a548506">00100</a>                 <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1wall__list.html#a8a06b6562bbf488ff30852cd1a548506">current_wall_size</a>;
<a name="l00101"></a>00101 };
<a name="l00102"></a>00102 <span class="comment"></span>
<a name="l00103"></a>00103 <span class="comment">/** \brief Class for representing a particle system in a three-dimensional</span>
<a name="l00104"></a>00104 <span class="comment"> * rectangular box.</span>
<a name="l00105"></a>00105 <span class="comment"> *</span>
<a name="l00106"></a>00106 <span class="comment"> * This class represents a system of particles in a three-dimensional</span>
<a name="l00107"></a>00107 <span class="comment"> * rectangular box. Any combination of non-periodic and periodic coordinates</span>
<a name="l00108"></a>00108 <span class="comment"> * can be used in the three coordinate directions. The class is not intended</span>
<a name="l00109"></a>00109 <span class="comment"> * for direct use, but instead forms the base of the container and</span>
<a name="l00110"></a>00110 <span class="comment"> * container_poly classes that add specialized routines for computing the</span>
<a name="l00111"></a>00111 <span class="comment"> * regular and radical Voronoi tessellations respectively. It contains routines</span>
<a name="l00112"></a>00112 <span class="comment"> * that are commonly between these two classes, such as those for drawing the</span>
<a name="l00113"></a>00113 <span class="comment"> * domain, and placing particles within the internal data structure.</span>
<a name="l00114"></a>00114 <span class="comment"> *</span>
<a name="l00115"></a>00115 <span class="comment"> * The class is derived from the wall_list class, which encapsulates routines</span>
<a name="l00116"></a>00116 <span class="comment"> * for associating walls with the container, and the voro_base class, which</span>
<a name="l00117"></a>00117 <span class="comment"> * encapsulates routines about the underlying computational grid. */</span>
<a name="l00118"></a><a class="code" href="classvoro_1_1container__base.html">00118</a> <span class="keyword">class </span><a class="code" href="classvoro_1_1container__base.html" title="Class for representing a particle system in a three-dimensional rectangular box.">container_base</a> : <span class="keyword">public</span> <a class="code" href="classvoro_1_1voro__base.html" title="Class containing data structures common across all particle container classes.">voro_base</a>, <span class="keyword">public</span> <a class="code" href="classvoro_1_1wall__list.html" title="A class for storing a list of pointers to walls.">wall_list</a> {
<a name="l00119"></a>00119         <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00120"></a>00120 <span class="comment">                /** The minimum x coordinate of the container. */</span>
<a name="l00121"></a><a class="code" href="classvoro_1_1container__base.html#ab33ca2a8d7282d65a731d854d27906f2">00121</a>                 <span class="keyword">const</span> <span class="keywordtype">double</span> <a class="code" href="classvoro_1_1container__base.html#ab33ca2a8d7282d65a731d854d27906f2">ax</a>;<span class="comment"></span>
<a name="l00122"></a>00122 <span class="comment">                /** The maximum x coordinate of the container. */</span>
<a name="l00123"></a><a class="code" href="classvoro_1_1container__base.html#afd9b8e6b3c6bb4376d1f755ef7ac789d">00123</a>                 <span class="keyword">const</span> <span class="keywordtype">double</span> <a class="code" href="classvoro_1_1container__base.html#afd9b8e6b3c6bb4376d1f755ef7ac789d">bx</a>;<span class="comment"></span>
<a name="l00124"></a>00124 <span class="comment">                /** The minimum y coordinate of the container. */</span>
<a name="l00125"></a><a class="code" href="classvoro_1_1container__base.html#ab64ef06e1e257e83a33422a044ef9858">00125</a>                 <span class="keyword">const</span> <span class="keywordtype">double</span> <a class="code" href="classvoro_1_1container__base.html#ab64ef06e1e257e83a33422a044ef9858">ay</a>;<span class="comment"></span>
<a name="l00126"></a>00126 <span class="comment">                /** The maximum y coordinate of the container. */</span>
<a name="l00127"></a><a class="code" href="classvoro_1_1container__base.html#ae769a416d7a5520eddf026cec6f7fda6">00127</a>                 <span class="keyword">const</span> <span class="keywordtype">double</span> <a class="code" href="classvoro_1_1container__base.html#ae769a416d7a5520eddf026cec6f7fda6">by</a>;<span class="comment"></span>
<a name="l00128"></a>00128 <span class="comment">                /** The minimum z coordinate of the container. */</span>
<a name="l00129"></a><a class="code" href="classvoro_1_1container__base.html#a78d795a863e401a5fc565c7dec31b6a6">00129</a>                 <span class="keyword">const</span> <span class="keywordtype">double</span> <a class="code" href="classvoro_1_1container__base.html#a78d795a863e401a5fc565c7dec31b6a6">az</a>;<span class="comment"></span>
<a name="l00130"></a>00130 <span class="comment">                /** The maximum z coordinate of the container. */</span>
<a name="l00131"></a><a class="code" href="classvoro_1_1container__base.html#a27de2088113bb64a4b045bea7c590be3">00131</a>                 <span class="keyword">const</span> <span class="keywordtype">double</span> <a class="code" href="classvoro_1_1container__base.html#a27de2088113bb64a4b045bea7c590be3">bz</a>;<span class="comment"></span>
<a name="l00132"></a>00132 <span class="comment">                /** A boolean value that determines if the x coordinate in</span>
<a name="l00133"></a>00133 <span class="comment">                 * periodic or not. */</span>
<a name="l00134"></a><a class="code" href="classvoro_1_1container__base.html#a6734b7147a71bb7e2a4a313d4153bebf">00134</a>                 <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1container__base.html#a6734b7147a71bb7e2a4a313d4153bebf">xperiodic</a>;<span class="comment"></span>
<a name="l00135"></a>00135 <span class="comment">                /** A boolean value that determines if the y coordinate in</span>
<a name="l00136"></a>00136 <span class="comment">                 * periodic or not. */</span>
<a name="l00137"></a><a class="code" href="classvoro_1_1container__base.html#a05a979d24c3d0fefe9f5cd96174863f8">00137</a>                 <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1container__base.html#a05a979d24c3d0fefe9f5cd96174863f8">yperiodic</a>;<span class="comment"></span>
<a name="l00138"></a>00138 <span class="comment">                /** A boolean value that determines if the z coordinate in</span>
<a name="l00139"></a>00139 <span class="comment">                 * periodic or not. */</span>
<a name="l00140"></a><a class="code" href="classvoro_1_1container__base.html#acd3bdff20b8b11a3e606e5581ebf3c06">00140</a>                 <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1container__base.html#acd3bdff20b8b11a3e606e5581ebf3c06">zperiodic</a>;<span class="comment"></span>
<a name="l00141"></a>00141 <span class="comment">                /** This array holds the numerical IDs of each particle in each</span>
<a name="l00142"></a>00142 <span class="comment">                 * computational box. */</span>
<a name="l00143"></a><a class="code" href="classvoro_1_1container__base.html#a50de485630d0b693fb418be1726826a7">00143</a>                 <span class="keywordtype">int</span> **<a class="code" href="classvoro_1_1container__base.html#a50de485630d0b693fb418be1726826a7">id</a>;<span class="comment"></span>
<a name="l00144"></a>00144 <span class="comment">                /** A two dimensional array holding particle positions. For the</span>
<a name="l00145"></a>00145 <span class="comment">                 * derived container_poly class, this also holds particle</span>
<a name="l00146"></a>00146 <span class="comment">                 * radii. */</span>
<a name="l00147"></a><a class="code" href="classvoro_1_1container__base.html#a0798a7623a37b1a9da86f225119606e5">00147</a>                 <span class="keywordtype">double</span> **<a class="code" href="classvoro_1_1container__base.html#a0798a7623a37b1a9da86f225119606e5">p</a>;<span class="comment"></span>
<a name="l00148"></a>00148 <span class="comment">                /** This array holds the number of particles within each</span>
<a name="l00149"></a>00149 <span class="comment">                 * computational box of the container. */</span>
<a name="l00150"></a><a class="code" href="classvoro_1_1container__base.html#a987e612ffd2c459adf8c1784d308ef51">00150</a>                 <span class="keywordtype">int</span> *<a class="code" href="classvoro_1_1container__base.html#a987e612ffd2c459adf8c1784d308ef51">co</a>;<span class="comment"></span>
<a name="l00151"></a>00151 <span class="comment">                /** This array holds the maximum amount of particle memory for</span>
<a name="l00152"></a>00152 <span class="comment">                 * each computational box of the container. If the number of</span>
<a name="l00153"></a>00153 <span class="comment">                 * particles in a particular box ever approaches this limit,</span>
<a name="l00154"></a>00154 <span class="comment">                 * more is allocated using the add_particle_memory() function.</span>
<a name="l00155"></a>00155 <span class="comment">                 */</span>
<a name="l00156"></a><a class="code" href="classvoro_1_1container__base.html#a633edc1737859a7dde8ca2e466e12cfe">00156</a>                 <span class="keywordtype">int</span> *<a class="code" href="classvoro_1_1container__base.html#a633edc1737859a7dde8ca2e466e12cfe">mem</a>;<span class="comment"></span>
<a name="l00157"></a>00157 <span class="comment">                /** The amount of memory in the array structure for each</span>
<a name="l00158"></a>00158 <span class="comment">                 * particle. This is set to 3 when the basic class is</span>
<a name="l00159"></a>00159 <span class="comment">                 * initialized, so that the array holds (x,y,z) positions. If</span>
<a name="l00160"></a>00160 <span class="comment">                 * the container class is initialized as part of the derived</span>
<a name="l00161"></a>00161 <span class="comment">                 * class container_poly, then this is set to 4, to also hold</span>
<a name="l00162"></a>00162 <span class="comment">                 * the particle radii. */</span>
<a name="l00163"></a><a class="code" href="classvoro_1_1container__base.html#a235781536a17eab85b547787ff3618ba">00163</a>                 <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1container__base.html#a235781536a17eab85b547787ff3618ba">ps</a>;
<a name="l00164"></a>00164                 <a class="code" href="classvoro_1_1container__base.html" title="Class for representing a particle system in a three-dimensional rectangular box.">container_base</a>(<span class="keywordtype">double</span> ax_,<span class="keywordtype">double</span> bx_,<span class="keywordtype">double</span> ay_,<span class="keywordtype">double</span> by_,<span class="keywordtype">double</span> az_,<span class="keywordtype">double</span> bz_,
<a name="l00165"></a>00165                                 <span class="keywordtype">int</span> nx_,<span class="keywordtype">int</span> ny_,<span class="keywordtype">int</span> nz_,<span class="keywordtype">bool</span> xperiodic_,<span class="keywordtype">bool</span> yperiodic_,<span class="keywordtype">bool</span> zperiodic_,
<a name="l00166"></a>00166                                 <span class="keywordtype">int</span> init_mem,<span class="keywordtype">int</span> ps_);
<a name="l00167"></a>00167                 ~<a class="code" href="classvoro_1_1container__base.html" title="Class for representing a particle system in a three-dimensional rectangular box.">container_base</a>();
<a name="l00168"></a>00168                 <span class="keywordtype">bool</span> point_inside(<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z);
<a name="l00169"></a>00169                 <span class="keywordtype">void</span> region_count();<span class="comment"></span>
<a name="l00170"></a>00170 <span class="comment">                /** Initializes the Voronoi cell prior to a compute_cell</span>
<a name="l00171"></a>00171 <span class="comment">                 * operation for a specific particle being carried out by a</span>
<a name="l00172"></a>00172 <span class="comment">                 * voro_compute class. The cell is initialized to fill the</span>
<a name="l00173"></a>00173 <span class="comment">                 * entire container. For non-periodic coordinates, this is set</span>
<a name="l00174"></a>00174 <span class="comment">                 * by the position of the walls. For periodic coordinates, the</span>
<a name="l00175"></a>00175 <span class="comment">                 * space is equally divided in either direction from the</span>
<a name="l00176"></a>00176 <span class="comment">                 * particle&#39;s initial position. Plane cuts made by any walls</span>
<a name="l00177"></a>00177 <span class="comment">                 * that have been added are then applied to the cell.</span>
<a name="l00178"></a>00178 <span class="comment">                 * \param[in,out] c a reference to a voronoicell object.</span>
<a name="l00179"></a>00179 <span class="comment">                 * \param[in] ijk the block that the particle is within.</span>
<a name="l00180"></a>00180 <span class="comment">                 * \param[in] q the index of the particle within its block.</span>
<a name="l00181"></a>00181 <span class="comment">                 * \param[in] (ci,cj,ck) the coordinates of the block in the</span>
<a name="l00182"></a>00182 <span class="comment">                 *                       container coordinate system.</span>
<a name="l00183"></a>00183 <span class="comment">                 * \param[out] (i,j,k) the coordinates of the test block</span>
<a name="l00184"></a>00184 <span class="comment">                 *                     relative to the voro_compute</span>
<a name="l00185"></a>00185 <span class="comment">                 *                     coordinate system.</span>
<a name="l00186"></a>00186 <span class="comment">                 * \param[out] (x,y,z) the position of the particle.</span>
<a name="l00187"></a>00187 <span class="comment">                 * \param[out] disp a block displacement used internally by the</span>
<a name="l00188"></a>00188 <span class="comment">                 *                  compute_cell routine.</span>
<a name="l00189"></a>00189 <span class="comment">                 * \return False if the plane cuts applied by walls completely</span>
<a name="l00190"></a>00190 <span class="comment">                 * removed the cell, true otherwise. */</span>
<a name="l00191"></a>00191                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> v_cell&gt;
<a name="l00192"></a><a class="code" href="classvoro_1_1container__base.html#af6d18399db1c92816296bc70af8440b5">00192</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> initialize_voronoicell(v_cell &amp;c,<span class="keywordtype">int</span> ijk,<span class="keywordtype">int</span> q,<span class="keywordtype">int</span> ci,<span class="keywordtype">int</span> cj,<span class="keywordtype">int</span> ck,
<a name="l00193"></a>00193                                 <span class="keywordtype">int</span> &amp;i,<span class="keywordtype">int</span> &amp;j,<span class="keywordtype">int</span> &amp;k,<span class="keywordtype">double</span> &amp;x,<span class="keywordtype">double</span> &amp;y,<span class="keywordtype">double</span> &amp;z,<span class="keywordtype">int</span> &amp;disp) {
<a name="l00194"></a>00194                         <span class="keywordtype">double</span> x1,x2,y1,y2,z1,z2,*pp=p[ijk]+ps*q;
<a name="l00195"></a>00195                         x=*(pp++);y=*(pp++);z=*pp;
<a name="l00196"></a>00196                         <span class="keywordflow">if</span>(xperiodic) {x1=-(x2=0.5*(bx-ax));i=nx;} <span class="keywordflow">else</span> {x1=ax-x;x2=bx-x;i=ci;}
<a name="l00197"></a>00197                         <span class="keywordflow">if</span>(yperiodic) {y1=-(y2=0.5*(by-ay));j=ny;} <span class="keywordflow">else</span> {y1=ay-y;y2=by-y;j=cj;}
<a name="l00198"></a>00198                         <span class="keywordflow">if</span>(zperiodic) {z1=-(z2=0.5*(bz-az));k=nz;} <span class="keywordflow">else</span> {z1=az-z;z2=bz-z;k=ck;}
<a name="l00199"></a>00199                         c.init(x1,x2,y1,y2,z1,z2);
<a name="l00200"></a>00200                         <span class="keywordflow">if</span>(!apply_walls(c,x,y,z)) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00201"></a>00201                         disp=ijk-i-nx*(j+ny*k);
<a name="l00202"></a>00202                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00203"></a>00203                 }<span class="comment"></span>
<a name="l00204"></a>00204 <span class="comment">                /** Initializes parameters for a find_voronoi_cell call within</span>
<a name="l00205"></a>00205 <span class="comment">                 * the voro_compute template.</span>
<a name="l00206"></a>00206 <span class="comment">                 * \param[in] (ci,cj,ck) the coordinates of the test block in</span>
<a name="l00207"></a>00207 <span class="comment">                 *                       the container coordinate system.</span>
<a name="l00208"></a>00208 <span class="comment">                 * \param[in] ijk the index of the test block</span>
<a name="l00209"></a>00209 <span class="comment">                 * \param[out] (i,j,k) the coordinates of the test block</span>
<a name="l00210"></a>00210 <span class="comment">                 *                     relative to the voro_compute</span>
<a name="l00211"></a>00211 <span class="comment">                 *                     coordinate system.</span>
<a name="l00212"></a>00212 <span class="comment">                 * \param[out] disp a block displacement used internally by the</span>
<a name="l00213"></a>00213 <span class="comment">                 *                  find_voronoi_cell routine. */</span>
<a name="l00214"></a><a class="code" href="classvoro_1_1container__base.html#a30dbb059792c199f2526c13990cd8daf">00214</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__base.html#a30dbb059792c199f2526c13990cd8daf">initialize_search</a>(<span class="keywordtype">int</span> ci,<span class="keywordtype">int</span> cj,<span class="keywordtype">int</span> ck,<span class="keywordtype">int</span> ijk,<span class="keywordtype">int</span> &amp;i,<span class="keywordtype">int</span> &amp;j,<span class="keywordtype">int</span> &amp;k,<span class="keywordtype">int</span> &amp;disp) {
<a name="l00215"></a>00215                         i=xperiodic?nx:ci;
<a name="l00216"></a>00216                         j=yperiodic?ny:cj;
<a name="l00217"></a>00217                         k=zperiodic?nz:ck;
<a name="l00218"></a>00218                         disp=ijk-i-nx*(j+ny*k);
<a name="l00219"></a>00219                 }<span class="comment"></span>
<a name="l00220"></a>00220 <span class="comment">                /** Returns the position of a particle currently being computed</span>
<a name="l00221"></a>00221 <span class="comment">                 * relative to the computational block that it is within. It is</span>
<a name="l00222"></a>00222 <span class="comment">                 * used to select the optimal worklist entry to use.</span>
<a name="l00223"></a>00223 <span class="comment">                 * \param[in] (x,y,z) the position of the particle.</span>
<a name="l00224"></a>00224 <span class="comment">                 * \param[in] (ci,cj,ck) the block that the particle is within.</span>
<a name="l00225"></a>00225 <span class="comment">                 * \param[out] (fx,fy,fz) the position relative to the block.</span>
<a name="l00226"></a>00226 <span class="comment">                 */</span>
<a name="l00227"></a><a class="code" href="classvoro_1_1container__base.html#a08db44d4d57b8b19f1e101cc40c82e85">00227</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> frac_pos(<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z,<span class="keywordtype">double</span> ci,<span class="keywordtype">double</span> cj,<span class="keywordtype">double</span> ck,
<a name="l00228"></a>00228                                 <span class="keywordtype">double</span> &amp;fx,<span class="keywordtype">double</span> &amp;fy,<span class="keywordtype">double</span> &amp;fz) {
<a name="l00229"></a>00229                         fx=x-ax-boxx*ci;
<a name="l00230"></a>00230                         fy=y-ay-boxy*cj;
<a name="l00231"></a>00231                         fz=z-az-boxz*ck;
<a name="l00232"></a>00232                 }<span class="comment"></span>
<a name="l00233"></a>00233 <span class="comment">                /** Calculates the index of block in the container structure</span>
<a name="l00234"></a>00234 <span class="comment">                 * corresponding to given coordinates.</span>
<a name="l00235"></a>00235 <span class="comment">                 * \param[in] (ci,cj,ck) the coordinates of the original block</span>
<a name="l00236"></a>00236 <span class="comment">                 *                       in the current computation, relative</span>
<a name="l00237"></a>00237 <span class="comment">                 *                       to the container coordinate system.</span>
<a name="l00238"></a>00238 <span class="comment">                 * \param[in] (ei,ej,ek) the displacement of the current block</span>
<a name="l00239"></a>00239 <span class="comment">                 *                       from the original block.</span>
<a name="l00240"></a>00240 <span class="comment">                 * \param[in,out] (qx,qy,qz) the periodic displacement that</span>
<a name="l00241"></a>00241 <span class="comment">                 *                           must be added to the particles</span>
<a name="l00242"></a>00242 <span class="comment">                 *                           within the computed block.</span>
<a name="l00243"></a>00243 <span class="comment">                 * \param[in] disp a block displacement used internally by the</span>
<a name="l00244"></a>00244 <span class="comment">                 *                  find_voronoi_cell and compute_cell routines.</span>
<a name="l00245"></a>00245 <span class="comment">                 * \return The block index. */</span>
<a name="l00246"></a><a class="code" href="classvoro_1_1container__base.html#a76b645960fba43620e096b7bdf178603">00246</a>                 <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1container__base.html#a76b645960fba43620e096b7bdf178603">region_index</a>(<span class="keywordtype">int</span> ci,<span class="keywordtype">int</span> cj,<span class="keywordtype">int</span> ck,<span class="keywordtype">int</span> ei,<span class="keywordtype">int</span> ej,<span class="keywordtype">int</span> ek,<span class="keywordtype">double</span> &amp;qx,<span class="keywordtype">double</span> &amp;qy,<span class="keywordtype">double</span> &amp;qz,<span class="keywordtype">int</span> &amp;disp) {
<a name="l00247"></a>00247                         <span class="keywordflow">if</span>(xperiodic) {<span class="keywordflow">if</span>(ci+ei&lt;nx) {ei+=nx;qx=-(bx-ax);} <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ci+ei&gt;=(nx&lt;&lt;1)) {ei-=nx;qx=bx-ax;} <span class="keywordflow">else</span> qx=0;}
<a name="l00248"></a>00248                         <span class="keywordflow">if</span>(yperiodic) {<span class="keywordflow">if</span>(cj+ej&lt;ny) {ej+=ny;qy=-(by-ay);} <span class="keywordflow">else</span> <span class="keywordflow">if</span>(cj+ej&gt;=(ny&lt;&lt;1)) {ej-=ny;qy=by-ay;} <span class="keywordflow">else</span> qy=0;}
<a name="l00249"></a>00249                         <span class="keywordflow">if</span>(zperiodic) {<span class="keywordflow">if</span>(ck+ek&lt;nz) {ek+=nz;qz=-(bz-az);} <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ck+ek&gt;=(nz&lt;&lt;1)) {ek-=nz;qz=bz-az;} <span class="keywordflow">else</span> qz=0;}
<a name="l00250"></a>00250                         <span class="keywordflow">return</span> disp+ei+nx*(ej+ny*ek);
<a name="l00251"></a>00251                 }
<a name="l00252"></a>00252                 <span class="keywordtype">void</span> draw_domain_gnuplot(FILE *fp=stdout);<span class="comment"></span>
<a name="l00253"></a>00253 <span class="comment">                /** Draws an outline of the domain in Gnuplot format.</span>
<a name="l00254"></a>00254 <span class="comment">                 * \param[in] filename the filename to write to. */</span>
<a name="l00255"></a><a class="code" href="classvoro_1_1container__base.html#a019db0a854b71ac57886155422bb53d6">00255</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__base.html#a019db0a854b71ac57886155422bb53d6">draw_domain_gnuplot</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* filename) {
<a name="l00256"></a>00256                         FILE *fp=safe_fopen(filename,<span class="stringliteral">&quot;w&quot;</span>);
<a name="l00257"></a>00257                         draw_domain_gnuplot(fp);
<a name="l00258"></a>00258                         fclose(fp);
<a name="l00259"></a>00259                 }
<a name="l00260"></a>00260                 <span class="keywordtype">void</span> draw_domain_pov(FILE *fp=stdout);<span class="comment"></span>
<a name="l00261"></a>00261 <span class="comment">                /** Draws an outline of the domain in Gnuplot format.</span>
<a name="l00262"></a>00262 <span class="comment">                 * \param[in] filename the filename to write to. */</span>
<a name="l00263"></a><a class="code" href="classvoro_1_1container__base.html#aa1c0c293bae52c879eb42035a031d8e8">00263</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__base.html#aa1c0c293bae52c879eb42035a031d8e8">draw_domain_pov</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* filename) {
<a name="l00264"></a>00264                         FILE *fp=safe_fopen(filename,<span class="stringliteral">&quot;w&quot;</span>);
<a name="l00265"></a>00265                         draw_domain_pov(fp);
<a name="l00266"></a>00266                         fclose(fp);
<a name="l00267"></a>00267                 }<span class="comment"></span>
<a name="l00268"></a>00268 <span class="comment">                /** Sums up the total number of stored particles.</span>
<a name="l00269"></a>00269 <span class="comment">                 * \return The number of particles. */</span>
<a name="l00270"></a><a class="code" href="classvoro_1_1container__base.html#ad9fe437b46f1e58908c393955e6d4217">00270</a>                 <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1container__base.html#ad9fe437b46f1e58908c393955e6d4217">total_particles</a>() {
<a name="l00271"></a>00271                         <span class="keywordtype">int</span> tp=*co;
<a name="l00272"></a>00272                         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> *cop=co+1;cop&lt;co+nxyz;cop++) tp+=*cop;
<a name="l00273"></a>00273                         <span class="keywordflow">return</span> tp;
<a name="l00274"></a>00274                 }
<a name="l00275"></a>00275         <span class="keyword">protected</span>:
<a name="l00276"></a>00276                 <span class="keywordtype">void</span> add_particle_memory(<span class="keywordtype">int</span> i);
<a name="l00277"></a>00277                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> put_locate_block(<span class="keywordtype">int</span> &amp;ijk,<span class="keywordtype">double</span> &amp;x,<span class="keywordtype">double</span> &amp;y,<span class="keywordtype">double</span> &amp;z);
<a name="l00278"></a>00278                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> put_remap(<span class="keywordtype">int</span> &amp;ijk,<span class="keywordtype">double</span> &amp;x,<span class="keywordtype">double</span> &amp;y,<span class="keywordtype">double</span> &amp;z);
<a name="l00279"></a>00279                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> remap(<span class="keywordtype">int</span> &amp;ai,<span class="keywordtype">int</span> &amp;aj,<span class="keywordtype">int</span> &amp;ak,<span class="keywordtype">int</span> &amp;ci,<span class="keywordtype">int</span> &amp;cj,<span class="keywordtype">int</span> &amp;ck,<span class="keywordtype">double</span> &amp;x,<span class="keywordtype">double</span> &amp;y,<span class="keywordtype">double</span> &amp;z,<span class="keywordtype">int</span> &amp;ijk);
<a name="l00280"></a>00280 };
<a name="l00281"></a>00281 <span class="comment"></span>
<a name="l00282"></a>00282 <span class="comment">/** \brief Extension of the container_base class for computing regular Voronoi</span>
<a name="l00283"></a>00283 <span class="comment"> * tessellations.</span>
<a name="l00284"></a>00284 <span class="comment"> *</span>
<a name="l00285"></a>00285 <span class="comment"> * This class is an extension of the container_base class that has routines</span>
<a name="l00286"></a>00286 <span class="comment"> * specifically for computing the regular Voronoi tessellation with no</span>
<a name="l00287"></a>00287 <span class="comment"> * dependence on particle radii. */</span>
<a name="l00288"></a><a class="code" href="classvoro_1_1container.html">00288</a> <span class="keyword">class </span><a class="code" href="classvoro_1_1container.html" title="Extension of the container_base class for computing regular Voronoi tessellations.">container</a> : <span class="keyword">public</span> <a class="code" href="classvoro_1_1container__base.html" title="Class for representing a particle system in a three-dimensional rectangular box.">container_base</a>, <span class="keyword">public</span> <a class="code" href="classvoro_1_1radius__mono.html" title="Class containing all of the routines that are specific to computing the regular Voronoi tessellation...">radius_mono</a> {
<a name="l00289"></a>00289         <span class="keyword">public</span>:
<a name="l00290"></a>00290                 <a class="code" href="classvoro_1_1container.html" title="Extension of the container_base class for computing regular Voronoi tessellations.">container</a>(<span class="keywordtype">double</span> ax_,<span class="keywordtype">double</span> bx_,<span class="keywordtype">double</span> ay_,<span class="keywordtype">double</span> by_,<span class="keywordtype">double</span> az_,<span class="keywordtype">double</span> bz_,
<a name="l00291"></a>00291                                 <span class="keywordtype">int</span> nx_,<span class="keywordtype">int</span> ny_,<span class="keywordtype">int</span> nz_,<span class="keywordtype">bool</span> xperiodic_,<span class="keywordtype">bool</span> yperiodic_,<span class="keywordtype">bool</span> zperiodic_,<span class="keywordtype">int</span> init_mem);
<a name="l00292"></a>00292                 <span class="keywordtype">void</span> clear();
<a name="l00293"></a>00293                 <span class="keywordtype">void</span> put(<span class="keywordtype">int</span> n,<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z);
<a name="l00294"></a>00294                 <span class="keywordtype">void</span> put(<a class="code" href="classvoro_1_1particle__order.html" title="A class for storing ordering information when particles are added to a container.">particle_order</a> &amp;vo,<span class="keywordtype">int</span> n,<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z);
<a name="l00295"></a>00295                 <span class="keywordtype">void</span> <span class="keyword">import</span>(FILE *fp=stdin);
<a name="l00296"></a>00296                 <span class="keywordtype">void</span> <span class="keyword">import</span>(<a class="code" href="classvoro_1_1particle__order.html" title="A class for storing ordering information when particles are added to a container.">particle_order</a> &amp;vo,FILE *fp=stdin);<span class="comment"></span>
<a name="l00297"></a>00297 <span class="comment">                /** Imports a list of particles from an open file stream into</span>
<a name="l00298"></a>00298 <span class="comment">                 * the container. Entries of four numbers (Particle ID, x</span>
<a name="l00299"></a>00299 <span class="comment">                 * position, y position, z position) are searched for. If the</span>
<a name="l00300"></a>00300 <span class="comment">                 * file cannot be successfully read, then the routine causes a</span>
<a name="l00301"></a>00301 <span class="comment">                 * fatal error.</span>
<a name="l00302"></a>00302 <span class="comment">                 * \param[in] filename the name of the file to open and read</span>
<a name="l00303"></a>00303 <span class="comment">                 *                     from. */</span>
<a name="l00304"></a><a class="code" href="classvoro_1_1container.html#a74d328c0a3f574668ff5dd9e34d22f1f">00304</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <span class="keyword">import</span>(<span class="keyword">const</span> <span class="keywordtype">char</span>* filename) {
<a name="l00305"></a>00305                         FILE *fp=safe_fopen(filename,<span class="stringliteral">&quot;r&quot;</span>);
<a name="l00306"></a>00306                         <span class="keyword">import</span>(fp);
<a name="l00307"></a>00307                         fclose(fp);
<a name="l00308"></a>00308                 }<span class="comment"></span>
<a name="l00309"></a>00309 <span class="comment">                /** Imports a list of particles from an open file stream into</span>
<a name="l00310"></a>00310 <span class="comment">                 * the container. Entries of four numbers (Particle ID, x</span>
<a name="l00311"></a>00311 <span class="comment">                 * position, y position, z position) are searched for. In</span>
<a name="l00312"></a>00312 <span class="comment">                 * addition, the order in which particles are read is saved</span>
<a name="l00313"></a>00313 <span class="comment">                 * into an ordering class. If the file cannot be successfully</span>
<a name="l00314"></a>00314 <span class="comment">                 * read, then the routine causes a fatal error.</span>
<a name="l00315"></a>00315 <span class="comment">                 * \param[in,out] vo the ordering class to use.</span>
<a name="l00316"></a>00316 <span class="comment">                 * \param[in] filename the name of the file to open and read</span>
<a name="l00317"></a>00317 <span class="comment">                 *                     from. */</span>
<a name="l00318"></a><a class="code" href="classvoro_1_1container.html#acd9da3dc12eecccd5db8af5ff111222c">00318</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <span class="keyword">import</span>(<a class="code" href="classvoro_1_1particle__order.html" title="A class for storing ordering information when particles are added to a container.">particle_order</a> &amp;vo,<span class="keyword">const</span> <span class="keywordtype">char</span>* filename) {
<a name="l00319"></a>00319                         FILE *fp=safe_fopen(filename,<span class="stringliteral">&quot;r&quot;</span>);
<a name="l00320"></a>00320                         <span class="keyword">import</span>(vo,fp);
<a name="l00321"></a>00321                         fclose(fp);
<a name="l00322"></a>00322                 }
<a name="l00323"></a>00323                 <span class="keywordtype">void</span> compute_all_cells();
<a name="l00324"></a>00324                 <span class="keywordtype">double</span> sum_cell_volumes();<span class="comment"></span>
<a name="l00325"></a>00325 <span class="comment">                /** Dumps particle IDs and positions to a file.</span>
<a name="l00326"></a>00326 <span class="comment">                 * \param[in] vl the loop class to use.</span>
<a name="l00327"></a>00327 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00328"></a>00328                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_loop&gt;
<a name="l00329"></a><a class="code" href="classvoro_1_1container.html#a39c6928b9e5d4351b01df6bbd4b8b72c">00329</a>                 <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container.html#a39c6928b9e5d4351b01df6bbd4b8b72c">draw_particles</a>(c_loop &amp;vl,FILE *fp) {
<a name="l00330"></a>00330                         <span class="keywordtype">double</span> *pp;
<a name="l00331"></a>00331                         <span class="keywordflow">if</span>(vl.start()) <span class="keywordflow">do</span> {
<a name="l00332"></a>00332                                 pp=p[vl.ijk]+3*vl.q;
<a name="l00333"></a>00333                                 fprintf(fp,<span class="stringliteral">&quot;%d %g %g %g\n&quot;</span>,<span class="keywordtype">id</span>[vl.ijk][vl.q],*pp,pp[1],pp[2]);
<a name="l00334"></a>00334                         } <span class="keywordflow">while</span>(vl.inc());
<a name="l00335"></a>00335                 }<span class="comment"></span>
<a name="l00336"></a>00336 <span class="comment">                /** Dumps all of the particle IDs and positions to a file.</span>
<a name="l00337"></a>00337 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00338"></a><a class="code" href="classvoro_1_1container.html#acf0d0e3a7cfb9c7445e99afc57dbee94">00338</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container.html#acf0d0e3a7cfb9c7445e99afc57dbee94">draw_particles</a>(FILE *fp=stdout) {
<a name="l00339"></a>00339                         <a class="code" href="classvoro_1_1c__loop__all.html" title="Class for looping over all of the particles in a container.">c_loop_all</a> vl(*<span class="keyword">this</span>);
<a name="l00340"></a>00340                         draw_particles(vl,fp);
<a name="l00341"></a>00341                 }<span class="comment"></span>
<a name="l00342"></a>00342 <span class="comment">                /** Dumps all of the particle IDs and positions to a file.</span>
<a name="l00343"></a>00343 <span class="comment">                 * \param[in] filename the name of the file to write to. */</span>
<a name="l00344"></a><a class="code" href="classvoro_1_1container.html#a4c5ac89711659787eba011afbee318be">00344</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container.html#a4c5ac89711659787eba011afbee318be">draw_particles</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *filename) {
<a name="l00345"></a>00345                         FILE *fp=safe_fopen(filename,<span class="stringliteral">&quot;w&quot;</span>);
<a name="l00346"></a>00346                         draw_particles(fp);
<a name="l00347"></a>00347                         fclose(fp);
<a name="l00348"></a>00348                 }<span class="comment"></span>
<a name="l00349"></a>00349 <span class="comment">                /** Dumps particle positions in POV-Ray format.</span>
<a name="l00350"></a>00350 <span class="comment">                 * \param[in] vl the loop class to use.</span>
<a name="l00351"></a>00351 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00352"></a>00352                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_loop&gt;
<a name="l00353"></a><a class="code" href="classvoro_1_1container.html#a4bfde4e186de8a12fbb5b5d7f16f9387">00353</a>                 <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container.html#a4bfde4e186de8a12fbb5b5d7f16f9387">draw_particles_pov</a>(c_loop &amp;vl,FILE *fp) {
<a name="l00354"></a>00354                         <span class="keywordtype">double</span> *pp;
<a name="l00355"></a>00355                         <span class="keywordflow">if</span>(vl.start()) <span class="keywordflow">do</span> {
<a name="l00356"></a>00356                                 pp=p[vl.ijk]+3*vl.q;
<a name="l00357"></a>00357                                 fprintf(fp,<span class="stringliteral">&quot;// id %d\nsphere{&lt;%g,%g,%g&gt;,s}\n&quot;</span>,
<a name="l00358"></a>00358                                                 <span class="keywordtype">id</span>[vl.ijk][vl.q],*pp,pp[1],pp[2]);
<a name="l00359"></a>00359                         } <span class="keywordflow">while</span>(vl.inc());
<a name="l00360"></a>00360                 }<span class="comment"></span>
<a name="l00361"></a>00361 <span class="comment">                /** Dumps all particle positions in POV-Ray format.</span>
<a name="l00362"></a>00362 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00363"></a><a class="code" href="classvoro_1_1container.html#adaebc99132288ce43dab36fe86b5497b">00363</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container.html#adaebc99132288ce43dab36fe86b5497b">draw_particles_pov</a>(FILE *fp=stdout) {
<a name="l00364"></a>00364                         <a class="code" href="classvoro_1_1c__loop__all.html" title="Class for looping over all of the particles in a container.">c_loop_all</a> vl(*<span class="keyword">this</span>);
<a name="l00365"></a>00365                         draw_particles_pov(vl,fp);
<a name="l00366"></a>00366                 }<span class="comment"></span>
<a name="l00367"></a>00367 <span class="comment">                /** Dumps all particle positions in POV-Ray format.</span>
<a name="l00368"></a>00368 <span class="comment">                 * \param[in] filename the name of the file to write to. */</span>
<a name="l00369"></a><a class="code" href="classvoro_1_1container.html#ad90375e99cea7db7c1b82d00853e2659">00369</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container.html#ad90375e99cea7db7c1b82d00853e2659">draw_particles_pov</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *filename) {
<a name="l00370"></a>00370                         FILE *fp=safe_fopen(filename,<span class="stringliteral">&quot;w&quot;</span>);
<a name="l00371"></a>00371                         draw_particles_pov(fp);
<a name="l00372"></a>00372                         fclose(fp);
<a name="l00373"></a>00373                 }<span class="comment"></span>
<a name="l00374"></a>00374 <span class="comment">                /** Computes Voronoi cells and saves the output in gnuplot</span>
<a name="l00375"></a>00375 <span class="comment">                 * format.</span>
<a name="l00376"></a>00376 <span class="comment">                 * \param[in] vl the loop class to use.</span>
<a name="l00377"></a>00377 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00378"></a>00378                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_loop&gt;
<a name="l00379"></a><a class="code" href="classvoro_1_1container.html#a13bc3a19033255fb04049288c7cd5818">00379</a>                 <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container.html#a13bc3a19033255fb04049288c7cd5818">draw_cells_gnuplot</a>(c_loop &amp;vl,FILE *fp) {
<a name="l00380"></a>00380                         <a class="code" href="classvoro_1_1voronoicell.html" title="Extension of the voronoicell_base class to represent a Voronoi cell without neighbor information...">voronoicell</a> c;<span class="keywordtype">double</span> *pp;
<a name="l00381"></a>00381                         <span class="keywordflow">if</span>(vl.start()) <span class="keywordflow">do</span> <span class="keywordflow">if</span>(compute_cell(c,vl)) {
<a name="l00382"></a>00382                                 pp=p[vl.ijk]+ps*vl.q;
<a name="l00383"></a>00383                                 c.<a class="code" href="classvoro_1_1voronoicell__base.html#a1c0657c1d89313089bbd437170c97d46">draw_gnuplot</a>(*pp,pp[1],pp[2],fp);
<a name="l00384"></a>00384                         } <span class="keywordflow">while</span>(vl.inc());
<a name="l00385"></a>00385                 }<span class="comment"></span>
<a name="l00386"></a>00386 <span class="comment">                /** Computes all Voronoi cells and saves the output in gnuplot</span>
<a name="l00387"></a>00387 <span class="comment">                 * format.</span>
<a name="l00388"></a>00388 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00389"></a><a class="code" href="classvoro_1_1container.html#a5812915614c26d5e52697902556ed996">00389</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container.html#a5812915614c26d5e52697902556ed996">draw_cells_gnuplot</a>(FILE *fp=stdout) {
<a name="l00390"></a>00390                         <a class="code" href="classvoro_1_1c__loop__all.html" title="Class for looping over all of the particles in a container.">c_loop_all</a> vl(*<span class="keyword">this</span>);
<a name="l00391"></a>00391                         draw_cells_gnuplot(vl,fp);
<a name="l00392"></a>00392                 }<span class="comment"></span>
<a name="l00393"></a>00393 <span class="comment">                /** Computes all Voronoi cells and saves the output in gnuplot</span>
<a name="l00394"></a>00394 <span class="comment">                 * format.</span>
<a name="l00395"></a>00395 <span class="comment">                 * \param[in] filename the name of the file to write to. */</span>
<a name="l00396"></a><a class="code" href="classvoro_1_1container.html#aa387c1b649fe6eabafe4546ae7410c6b">00396</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container.html#aa387c1b649fe6eabafe4546ae7410c6b">draw_cells_gnuplot</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *filename) {
<a name="l00397"></a>00397                         FILE *fp=safe_fopen(filename,<span class="stringliteral">&quot;w&quot;</span>);
<a name="l00398"></a>00398                         draw_cells_gnuplot(fp);
<a name="l00399"></a>00399                         fclose(fp);
<a name="l00400"></a>00400                 }<span class="comment"></span>
<a name="l00401"></a>00401 <span class="comment">                /** Computes Voronoi cells and saves the output in POV-Ray</span>
<a name="l00402"></a>00402 <span class="comment">                 * format.</span>
<a name="l00403"></a>00403 <span class="comment">                 * \param[in] vl the loop class to use.</span>
<a name="l00404"></a>00404 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00405"></a>00405                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_loop&gt;
<a name="l00406"></a><a class="code" href="classvoro_1_1container.html#af39b3d55e12a5b1d6acbab77d762cff3">00406</a>                 <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container.html#af39b3d55e12a5b1d6acbab77d762cff3">draw_cells_pov</a>(c_loop &amp;vl,FILE *fp) {
<a name="l00407"></a>00407                         <a class="code" href="classvoro_1_1voronoicell.html" title="Extension of the voronoicell_base class to represent a Voronoi cell without neighbor information...">voronoicell</a> c;<span class="keywordtype">double</span> *pp;
<a name="l00408"></a>00408                         <span class="keywordflow">if</span>(vl.start()) <span class="keywordflow">do</span> <span class="keywordflow">if</span>(compute_cell(c,vl)) {
<a name="l00409"></a>00409                                 fprintf(fp,<span class="stringliteral">&quot;// cell %d\n&quot;</span>,<span class="keywordtype">id</span>[vl.ijk][vl.q]);
<a name="l00410"></a>00410                                 pp=p[vl.ijk]+ps*vl.q;
<a name="l00411"></a>00411                                 c.<a class="code" href="classvoro_1_1voronoicell__base.html#a923ffa62bd5d62070cd29e01f3a1327a">draw_pov</a>(*pp,pp[1],pp[2],fp);
<a name="l00412"></a>00412                         } <span class="keywordflow">while</span>(vl.inc());
<a name="l00413"></a>00413                 }<span class="comment"></span>
<a name="l00414"></a>00414 <span class="comment">                /** Computes all Voronoi cells and saves the output in POV-Ray</span>
<a name="l00415"></a>00415 <span class="comment">                 * format.</span>
<a name="l00416"></a>00416 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00417"></a><a class="code" href="classvoro_1_1container.html#ac6ec5c8fec1cec5185af19bb21832fcb">00417</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container.html#ac6ec5c8fec1cec5185af19bb21832fcb">draw_cells_pov</a>(FILE *fp=stdout) {
<a name="l00418"></a>00418                         <a class="code" href="classvoro_1_1c__loop__all.html" title="Class for looping over all of the particles in a container.">c_loop_all</a> vl(*<span class="keyword">this</span>);
<a name="l00419"></a>00419                         draw_cells_pov(vl,fp);
<a name="l00420"></a>00420                 }<span class="comment"></span>
<a name="l00421"></a>00421 <span class="comment">                /** Computes all Voronoi cells and saves the output in POV-Ray</span>
<a name="l00422"></a>00422 <span class="comment">                 * format.</span>
<a name="l00423"></a>00423 <span class="comment">                 * \param[in] filename the name of the file to write to. */</span>
<a name="l00424"></a><a class="code" href="classvoro_1_1container.html#a3f9a6147040c60ff579dcd96c05800c9">00424</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container.html#a3f9a6147040c60ff579dcd96c05800c9">draw_cells_pov</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *filename) {
<a name="l00425"></a>00425                         FILE *fp=safe_fopen(filename,<span class="stringliteral">&quot;w&quot;</span>);
<a name="l00426"></a>00426                         draw_cells_pov(fp);
<a name="l00427"></a>00427                         fclose(fp);
<a name="l00428"></a>00428                 }<span class="comment"></span>
<a name="l00429"></a>00429 <span class="comment">                /** Computes the Voronoi cells and saves customized information</span>
<a name="l00430"></a>00430 <span class="comment">                 * about them.</span>
<a name="l00431"></a>00431 <span class="comment">                 * \param[in] vl the loop class to use.</span>
<a name="l00432"></a>00432 <span class="comment">                 * \param[in] format the custom output string to use.</span>
<a name="l00433"></a>00433 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00434"></a>00434                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_loop&gt;
<a name="l00435"></a><a class="code" href="classvoro_1_1container.html#a35c0c0b78ca0ba3fa10e6a9c4eece492">00435</a>                 <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container.html#a35c0c0b78ca0ba3fa10e6a9c4eece492">print_custom</a>(c_loop &amp;vl,<span class="keyword">const</span> <span class="keywordtype">char</span> *format,FILE *fp) {
<a name="l00436"></a>00436                         <span class="keywordtype">int</span> ijk,q;<span class="keywordtype">double</span> *pp;
<a name="l00437"></a>00437                         <span class="keywordflow">if</span>(contains_neighbor(format)) {
<a name="l00438"></a>00438                                 <a class="code" href="classvoro_1_1voronoicell__neighbor.html" title="Extension of the voronoicell_base class to represent a Voronoi cell with neighbor information...">voronoicell_neighbor</a> c;
<a name="l00439"></a>00439                                 <span class="keywordflow">if</span>(vl.start()) <span class="keywordflow">do</span> <span class="keywordflow">if</span>(compute_cell(c,vl)) {
<a name="l00440"></a>00440                                         ijk=vl.ijk;q=vl.q;pp=p[ijk]+ps*q;
<a name="l00441"></a>00441                                         c.<a class="code" href="classvoro_1_1voronoicell__base.html#a095c6bfc1b9b7a087d0b35b443e5c023">output_custom</a>(format,<span class="keywordtype">id</span>[ijk][q],*pp,pp[1],pp[2],default_radius,fp);
<a name="l00442"></a>00442                                 } <span class="keywordflow">while</span>(vl.inc());
<a name="l00443"></a>00443                         } <span class="keywordflow">else</span> {
<a name="l00444"></a>00444                                 <a class="code" href="classvoro_1_1voronoicell.html" title="Extension of the voronoicell_base class to represent a Voronoi cell without neighbor information...">voronoicell</a> c;
<a name="l00445"></a>00445                                 <span class="keywordflow">if</span>(vl.start()) <span class="keywordflow">do</span> <span class="keywordflow">if</span>(compute_cell(c,vl)) {
<a name="l00446"></a>00446                                         ijk=vl.ijk;q=vl.q;pp=p[ijk]+ps*q;
<a name="l00447"></a>00447                                         c.<a class="code" href="classvoro_1_1voronoicell__base.html#a095c6bfc1b9b7a087d0b35b443e5c023">output_custom</a>(format,<span class="keywordtype">id</span>[ijk][q],*pp,pp[1],pp[2],default_radius,fp);
<a name="l00448"></a>00448                                 } <span class="keywordflow">while</span>(vl.inc());
<a name="l00449"></a>00449                         }
<a name="l00450"></a>00450                 }
<a name="l00451"></a>00451                 <span class="keywordtype">void</span> print_custom(<span class="keyword">const</span> <span class="keywordtype">char</span> *format,FILE *fp=stdout);
<a name="l00452"></a>00452                 <span class="keywordtype">void</span> print_custom(<span class="keyword">const</span> <span class="keywordtype">char</span> *format,<span class="keyword">const</span> <span class="keywordtype">char</span> *filename);
<a name="l00453"></a>00453                 <span class="keywordtype">bool</span> find_voronoi_cell(<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z,<span class="keywordtype">double</span> &amp;rx,<span class="keywordtype">double</span> &amp;ry,<span class="keywordtype">double</span> &amp;rz,<span class="keywordtype">int</span> &amp;pid);<span class="comment"></span>
<a name="l00454"></a>00454 <span class="comment">                /** Computes the Voronoi cell for a particle currently being</span>
<a name="l00455"></a>00455 <span class="comment">                 * referenced by a loop class.</span>
<a name="l00456"></a>00456 <span class="comment">                 * \param[out] c a Voronoi cell class in which to store the</span>
<a name="l00457"></a>00457 <span class="comment">                 *               computed cell.</span>
<a name="l00458"></a>00458 <span class="comment">                 * \param[in] vl the loop class to use.</span>
<a name="l00459"></a>00459 <span class="comment">                 * \return True if the cell was computed. If the cell cannot be</span>
<a name="l00460"></a>00460 <span class="comment">                 * computed, if it is removed entirely by a wall or boundary</span>
<a name="l00461"></a>00461 <span class="comment">                 * condition, then the routine returns false. */</span>
<a name="l00462"></a>00462                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> v_cell,<span class="keyword">class</span> c_loop&gt;
<a name="l00463"></a><a class="code" href="classvoro_1_1container.html#a9808b60d80f1d3ccc06ebd0a2495ac7a">00463</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1container.html#a9808b60d80f1d3ccc06ebd0a2495ac7a">compute_cell</a>(v_cell &amp;c,c_loop &amp;vl) {
<a name="l00464"></a>00464                         <span class="keywordflow">return</span> vc.compute_cell(c,vl.ijk,vl.q,vl.i,vl.j,vl.k);
<a name="l00465"></a>00465                 }<span class="comment"></span>
<a name="l00466"></a>00466 <span class="comment">                /** Computes the Voronoi cell for given particle.</span>
<a name="l00467"></a>00467 <span class="comment">                 * \param[out] c a Voronoi cell class in which to store the</span>
<a name="l00468"></a>00468 <span class="comment">                 *               computed cell.</span>
<a name="l00469"></a>00469 <span class="comment">                 * \param[in] ijk the block that the particle is within.</span>
<a name="l00470"></a>00470 <span class="comment">                 * \param[in] q the index of the particle within the block.</span>
<a name="l00471"></a>00471 <span class="comment">                 * \return True if the cell was computed. If the cell cannot be</span>
<a name="l00472"></a>00472 <span class="comment">                 * computed, if it is removed entirely by a wall or boundary</span>
<a name="l00473"></a>00473 <span class="comment">                 * condition, then the routine returns false. */</span>
<a name="l00474"></a>00474                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> v_cell&gt;
<a name="l00475"></a><a class="code" href="classvoro_1_1container.html#ad600a135ee01c2f1c08a5b9da58398ad">00475</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1container.html#ad600a135ee01c2f1c08a5b9da58398ad">compute_cell</a>(v_cell &amp;c,<span class="keywordtype">int</span> ijk,<span class="keywordtype">int</span> q) {
<a name="l00476"></a>00476                         <span class="keywordtype">int</span> k=ijk/nxy,ijkt=ijk-nxy*k,j=ijkt/nx,i=ijkt-j*nx;
<a name="l00477"></a>00477                         <span class="keywordflow">return</span> vc.compute_cell(c,ijk,q,i,j,k);
<a name="l00478"></a>00478                 }
<a name="l00479"></a>00479         <span class="keyword">private</span>:
<a name="l00480"></a>00480                 <a class="code" href="classvoro_1_1voro__compute.html">voro_compute&lt;container&gt;</a> vc;
<a name="l00481"></a>00481                 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classvoro_1_1voro__compute.html" title="Template for carrying out Voronoi cell computations.">voro_compute</a>&lt;<a class="code" href="classvoro_1_1container.html" title="Extension of the container_base class for computing regular Voronoi tessellations.">container</a>&gt;;
<a name="l00482"></a>00482 };
<a name="l00483"></a>00483 <span class="comment"></span>
<a name="l00484"></a>00484 <span class="comment">/** \brief Extension of the container_base class for computing radical Voronoi</span>
<a name="l00485"></a>00485 <span class="comment"> * tessellations.</span>
<a name="l00486"></a>00486 <span class="comment"> *</span>
<a name="l00487"></a>00487 <span class="comment"> * This class is an extension of container_base class that has routines</span>
<a name="l00488"></a>00488 <span class="comment"> * specifically for computing the radical Voronoi tessellation that depends on</span>
<a name="l00489"></a>00489 <span class="comment"> * the particle radii. */</span>
<a name="l00490"></a><a class="code" href="classvoro_1_1container__poly.html">00490</a> <span class="keyword">class </span><a class="code" href="classvoro_1_1container__poly.html" title="Extension of the container_base class for computing radical Voronoi tessellations.">container_poly</a> : <span class="keyword">public</span> <a class="code" href="classvoro_1_1container__base.html" title="Class for representing a particle system in a three-dimensional rectangular box.">container_base</a>, <span class="keyword">public</span> <a class="code" href="classvoro_1_1radius__poly.html" title="Class containing all of the routines that are specific to computing the radical Voronoi tessellation...">radius_poly</a> {
<a name="l00491"></a>00491         <span class="keyword">public</span>:
<a name="l00492"></a>00492                 <a class="code" href="classvoro_1_1container__poly.html" title="Extension of the container_base class for computing radical Voronoi tessellations.">container_poly</a>(<span class="keywordtype">double</span> ax_,<span class="keywordtype">double</span> bx_,<span class="keywordtype">double</span> ay_,<span class="keywordtype">double</span> by_,<span class="keywordtype">double</span> az_,<span class="keywordtype">double</span> bz_,
<a name="l00493"></a>00493                                 <span class="keywordtype">int</span> nx_,<span class="keywordtype">int</span> ny_,<span class="keywordtype">int</span> nz_,<span class="keywordtype">bool</span> xperiodic_,<span class="keywordtype">bool</span> yperiodic_,<span class="keywordtype">bool</span> zperiodic_,<span class="keywordtype">int</span> init_mem);
<a name="l00494"></a>00494                 <span class="keywordtype">void</span> clear();
<a name="l00495"></a>00495                 <span class="keywordtype">void</span> put(<span class="keywordtype">int</span> n,<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z,<span class="keywordtype">double</span> r);
<a name="l00496"></a>00496                 <span class="keywordtype">void</span> put(<a class="code" href="classvoro_1_1particle__order.html" title="A class for storing ordering information when particles are added to a container.">particle_order</a> &amp;vo,<span class="keywordtype">int</span> n,<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z,<span class="keywordtype">double</span> r);
<a name="l00497"></a>00497                 <span class="keywordtype">void</span> <span class="keyword">import</span>(FILE *fp=stdin);
<a name="l00498"></a>00498                 <span class="keywordtype">void</span> <span class="keyword">import</span>(<a class="code" href="classvoro_1_1particle__order.html" title="A class for storing ordering information when particles are added to a container.">particle_order</a> &amp;vo,FILE *fp=stdin);<span class="comment"></span>
<a name="l00499"></a>00499 <span class="comment">                /** Imports a list of particles from an open file stream into</span>
<a name="l00500"></a>00500 <span class="comment">                 * the container_poly class. Entries of five numbers (Particle</span>
<a name="l00501"></a>00501 <span class="comment">                 * ID, x position, y position, z position, radius) are searched</span>
<a name="l00502"></a>00502 <span class="comment">                 * for. If the file cannot be successfully read, then the</span>
<a name="l00503"></a>00503 <span class="comment">                 * routine causes a fatal error.</span>
<a name="l00504"></a>00504 <span class="comment">                 * \param[in] filename the name of the file to open and read</span>
<a name="l00505"></a>00505 <span class="comment">                 *                     from. */</span>
<a name="l00506"></a><a class="code" href="classvoro_1_1container__poly.html#a0b8b64b39bab75e3cfc9282a23706bab">00506</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <span class="keyword">import</span>(<span class="keyword">const</span> <span class="keywordtype">char</span>* filename) {
<a name="l00507"></a>00507                         FILE *fp=safe_fopen(filename,<span class="stringliteral">&quot;r&quot;</span>);
<a name="l00508"></a>00508                         <span class="keyword">import</span>(fp);
<a name="l00509"></a>00509                         fclose(fp);
<a name="l00510"></a>00510                 }<span class="comment"></span>
<a name="l00511"></a>00511 <span class="comment">                /** Imports a list of particles from an open file stream into</span>
<a name="l00512"></a>00512 <span class="comment">                 * the container_poly class. Entries of five numbers (Particle</span>
<a name="l00513"></a>00513 <span class="comment">                 * ID, x position, y position, z position, radius) are searched</span>
<a name="l00514"></a>00514 <span class="comment">                 * for. In addition, the order in which particles are read is</span>
<a name="l00515"></a>00515 <span class="comment">                 * saved into an ordering class. If the file cannot be</span>
<a name="l00516"></a>00516 <span class="comment">                 * successfully read, then the routine causes a fatal error.</span>
<a name="l00517"></a>00517 <span class="comment">                 * \param[in,out] vo the ordering class to use.</span>
<a name="l00518"></a>00518 <span class="comment">                 * \param[in] filename the name of the file to open and read</span>
<a name="l00519"></a>00519 <span class="comment">                 *                     from. */</span>
<a name="l00520"></a><a class="code" href="classvoro_1_1container__poly.html#af897ea09b80064d4b492862884ba316c">00520</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <span class="keyword">import</span>(<a class="code" href="classvoro_1_1particle__order.html" title="A class for storing ordering information when particles are added to a container.">particle_order</a> &amp;vo,<span class="keyword">const</span> <span class="keywordtype">char</span>* filename) {
<a name="l00521"></a>00521                         FILE *fp=safe_fopen(filename,<span class="stringliteral">&quot;r&quot;</span>);
<a name="l00522"></a>00522                         <span class="keyword">import</span>(vo,fp);
<a name="l00523"></a>00523                         fclose(fp);
<a name="l00524"></a>00524                 }
<a name="l00525"></a>00525                 <span class="keywordtype">void</span> compute_all_cells();
<a name="l00526"></a>00526                 <span class="keywordtype">double</span> sum_cell_volumes();<span class="comment"></span>
<a name="l00527"></a>00527 <span class="comment">                /** Dumps particle IDs, positions and radii to a file.</span>
<a name="l00528"></a>00528 <span class="comment">                 * \param[in] vl the loop class to use.</span>
<a name="l00529"></a>00529 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00530"></a>00530                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_loop&gt;
<a name="l00531"></a><a class="code" href="classvoro_1_1container__poly.html#af67af614b2b3ad084dfab83470fa8616">00531</a>                 <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__poly.html#af67af614b2b3ad084dfab83470fa8616">draw_particles</a>(c_loop &amp;vl,FILE *fp) {
<a name="l00532"></a>00532                         <span class="keywordtype">double</span> *pp;
<a name="l00533"></a>00533                         <span class="keywordflow">if</span>(vl.start()) <span class="keywordflow">do</span> {
<a name="l00534"></a>00534                                 pp=p[vl.ijk]+4*vl.q;
<a name="l00535"></a>00535                                 fprintf(fp,<span class="stringliteral">&quot;%d %g %g %g %g\n&quot;</span>,<span class="keywordtype">id</span>[vl.ijk][vl.q],*pp,pp[1],pp[2],pp[3]);
<a name="l00536"></a>00536                         } <span class="keywordflow">while</span>(vl.inc());
<a name="l00537"></a>00537                 }<span class="comment"></span>
<a name="l00538"></a>00538 <span class="comment">                /** Dumps all of the particle IDs, positions and radii to a</span>
<a name="l00539"></a>00539 <span class="comment">                 * file.</span>
<a name="l00540"></a>00540 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00541"></a><a class="code" href="classvoro_1_1container__poly.html#a25b1e68cf0ad4f60c7723afc9ad97bb2">00541</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__poly.html#a25b1e68cf0ad4f60c7723afc9ad97bb2">draw_particles</a>(FILE *fp=stdout) {
<a name="l00542"></a>00542                         <a class="code" href="classvoro_1_1c__loop__all.html" title="Class for looping over all of the particles in a container.">c_loop_all</a> vl(*<span class="keyword">this</span>);
<a name="l00543"></a>00543                         draw_particles(vl,fp);
<a name="l00544"></a>00544                 }<span class="comment"></span>
<a name="l00545"></a>00545 <span class="comment">                /** Dumps all of the particle IDs, positions and radii to a</span>
<a name="l00546"></a>00546 <span class="comment">                 * file.</span>
<a name="l00547"></a>00547 <span class="comment">                 * \param[in] filename the name of the file to write to. */</span>
<a name="l00548"></a><a class="code" href="classvoro_1_1container__poly.html#a8a20a1a70dd32c3323307be038bebb1d">00548</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__poly.html#a8a20a1a70dd32c3323307be038bebb1d">draw_particles</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *filename) {
<a name="l00549"></a>00549                         FILE *fp=safe_fopen(filename,<span class="stringliteral">&quot;w&quot;</span>);
<a name="l00550"></a>00550                         draw_particles(fp);
<a name="l00551"></a>00551                         fclose(fp);
<a name="l00552"></a>00552                 }<span class="comment"></span>
<a name="l00553"></a>00553 <span class="comment">                /** Dumps particle positions in POV-Ray format.</span>
<a name="l00554"></a>00554 <span class="comment">                 * \param[in] vl the loop class to use.</span>
<a name="l00555"></a>00555 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00556"></a>00556                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_loop&gt;
<a name="l00557"></a><a class="code" href="classvoro_1_1container__poly.html#a56313161f9104ef0356238569317a34c">00557</a>                 <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__poly.html#a56313161f9104ef0356238569317a34c">draw_particles_pov</a>(c_loop &amp;vl,FILE *fp) {
<a name="l00558"></a>00558                         <span class="keywordtype">double</span> *pp;
<a name="l00559"></a>00559                         <span class="keywordflow">if</span>(vl.start()) <span class="keywordflow">do</span> {
<a name="l00560"></a>00560                                 pp=p[vl.ijk]+4*vl.q;
<a name="l00561"></a>00561                                 fprintf(fp,<span class="stringliteral">&quot;// id %d\nsphere{&lt;%g,%g,%g&gt;,%g}\n&quot;</span>,
<a name="l00562"></a>00562                                                 <span class="keywordtype">id</span>[vl.ijk][vl.q],*pp,pp[1],pp[2],pp[3]);
<a name="l00563"></a>00563                         } <span class="keywordflow">while</span>(vl.inc());
<a name="l00564"></a>00564                 }<span class="comment"></span>
<a name="l00565"></a>00565 <span class="comment">                /** Dumps all the particle positions in POV-Ray format.</span>
<a name="l00566"></a>00566 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00567"></a><a class="code" href="classvoro_1_1container__poly.html#a477ecfe9e0943e71a2e389d7cc85ab20">00567</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__poly.html#a477ecfe9e0943e71a2e389d7cc85ab20">draw_particles_pov</a>(FILE *fp=stdout) {
<a name="l00568"></a>00568                         <a class="code" href="classvoro_1_1c__loop__all.html" title="Class for looping over all of the particles in a container.">c_loop_all</a> vl(*<span class="keyword">this</span>);
<a name="l00569"></a>00569                         draw_particles_pov(vl,fp);
<a name="l00570"></a>00570                 }<span class="comment"></span>
<a name="l00571"></a>00571 <span class="comment">                /** Dumps all the particle positions in POV-Ray format.</span>
<a name="l00572"></a>00572 <span class="comment">                 * \param[in] filename the name of the file to write to. */</span>
<a name="l00573"></a><a class="code" href="classvoro_1_1container__poly.html#a866cce7547f14634e432d510050962ae">00573</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__poly.html#a866cce7547f14634e432d510050962ae">draw_particles_pov</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *filename) {
<a name="l00574"></a>00574                         FILE *fp=safe_fopen(filename,<span class="stringliteral">&quot;w&quot;</span>);
<a name="l00575"></a>00575                         draw_particles_pov(fp);
<a name="l00576"></a>00576                         fclose(fp);
<a name="l00577"></a>00577                 }<span class="comment"></span>
<a name="l00578"></a>00578 <span class="comment">                /** Computes Voronoi cells and saves the output in gnuplot</span>
<a name="l00579"></a>00579 <span class="comment">                 * format.</span>
<a name="l00580"></a>00580 <span class="comment">                 * \param[in] vl the loop class to use.</span>
<a name="l00581"></a>00581 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00582"></a>00582                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_loop&gt;
<a name="l00583"></a><a class="code" href="classvoro_1_1container__poly.html#ab1efabec22bdbff42302d94620a71937">00583</a>                 <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__poly.html#ab1efabec22bdbff42302d94620a71937">draw_cells_gnuplot</a>(c_loop &amp;vl,FILE *fp) {
<a name="l00584"></a>00584                         <a class="code" href="classvoro_1_1voronoicell.html" title="Extension of the voronoicell_base class to represent a Voronoi cell without neighbor information...">voronoicell</a> c;<span class="keywordtype">double</span> *pp;
<a name="l00585"></a>00585                         <span class="keywordflow">if</span>(vl.start()) <span class="keywordflow">do</span> <span class="keywordflow">if</span>(compute_cell(c,vl)) {
<a name="l00586"></a>00586                                 pp=p[vl.ijk]+ps*vl.q;
<a name="l00587"></a>00587                                 c.<a class="code" href="classvoro_1_1voronoicell__base.html#a1c0657c1d89313089bbd437170c97d46">draw_gnuplot</a>(*pp,pp[1],pp[2],fp);
<a name="l00588"></a>00588                         } <span class="keywordflow">while</span>(vl.inc());
<a name="l00589"></a>00589                 }<span class="comment"></span>
<a name="l00590"></a>00590 <span class="comment">                /** Compute all Voronoi cells and saves the output in gnuplot</span>
<a name="l00591"></a>00591 <span class="comment">                 * format.</span>
<a name="l00592"></a>00592 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00593"></a><a class="code" href="classvoro_1_1container__poly.html#ac0700e38ce6ed742dcb52ab6523b1956">00593</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__poly.html#ac0700e38ce6ed742dcb52ab6523b1956">draw_cells_gnuplot</a>(FILE *fp=stdout) {
<a name="l00594"></a>00594                         <a class="code" href="classvoro_1_1c__loop__all.html" title="Class for looping over all of the particles in a container.">c_loop_all</a> vl(*<span class="keyword">this</span>);
<a name="l00595"></a>00595                         draw_cells_gnuplot(vl,fp);
<a name="l00596"></a>00596                 }<span class="comment"></span>
<a name="l00597"></a>00597 <span class="comment">                /** Compute all Voronoi cells and saves the output in gnuplot</span>
<a name="l00598"></a>00598 <span class="comment">                 * format.</span>
<a name="l00599"></a>00599 <span class="comment">                 * \param[in] filename the name of the file to write to. */</span>
<a name="l00600"></a><a class="code" href="classvoro_1_1container__poly.html#ad360a8ec2c8d59b69b65f34fdba92887">00600</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__poly.html#ad360a8ec2c8d59b69b65f34fdba92887">draw_cells_gnuplot</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *filename) {
<a name="l00601"></a>00601                         FILE *fp=safe_fopen(filename,<span class="stringliteral">&quot;w&quot;</span>);
<a name="l00602"></a>00602                         draw_cells_gnuplot(fp);
<a name="l00603"></a>00603                         fclose(fp);
<a name="l00604"></a>00604                 }<span class="comment"></span>
<a name="l00605"></a>00605 <span class="comment">                /** Computes Voronoi cells and saves the output in POV-Ray</span>
<a name="l00606"></a>00606 <span class="comment">                 * format.</span>
<a name="l00607"></a>00607 <span class="comment">                 * \param[in] vl the loop class to use.</span>
<a name="l00608"></a>00608 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00609"></a>00609                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_loop&gt;
<a name="l00610"></a><a class="code" href="classvoro_1_1container__poly.html#aaaddce8c16e4df211db3cbe9f9ca83de">00610</a>                 <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__poly.html#aaaddce8c16e4df211db3cbe9f9ca83de">draw_cells_pov</a>(c_loop &amp;vl,FILE *fp) {
<a name="l00611"></a>00611                         <a class="code" href="classvoro_1_1voronoicell.html" title="Extension of the voronoicell_base class to represent a Voronoi cell without neighbor information...">voronoicell</a> c;<span class="keywordtype">double</span> *pp;
<a name="l00612"></a>00612                         <span class="keywordflow">if</span>(vl.start()) <span class="keywordflow">do</span> <span class="keywordflow">if</span>(compute_cell(c,vl)) {
<a name="l00613"></a>00613                                 fprintf(fp,<span class="stringliteral">&quot;// cell %d\n&quot;</span>,<span class="keywordtype">id</span>[vl.ijk][vl.q]);
<a name="l00614"></a>00614                                 pp=p[vl.ijk]+ps*vl.q;
<a name="l00615"></a>00615                                 c.<a class="code" href="classvoro_1_1voronoicell__base.html#a923ffa62bd5d62070cd29e01f3a1327a">draw_pov</a>(*pp,pp[1],pp[2],fp);
<a name="l00616"></a>00616                         } <span class="keywordflow">while</span>(vl.inc());
<a name="l00617"></a>00617                 }<span class="comment"></span>
<a name="l00618"></a>00618 <span class="comment">                /** Computes all Voronoi cells and saves the output in POV-Ray</span>
<a name="l00619"></a>00619 <span class="comment">                 * format.</span>
<a name="l00620"></a>00620 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00621"></a><a class="code" href="classvoro_1_1container__poly.html#a8d56858927fc6686696e4338f9ac784d">00621</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__poly.html#a8d56858927fc6686696e4338f9ac784d">draw_cells_pov</a>(FILE *fp=stdout) {
<a name="l00622"></a>00622                         <a class="code" href="classvoro_1_1c__loop__all.html" title="Class for looping over all of the particles in a container.">c_loop_all</a> vl(*<span class="keyword">this</span>);
<a name="l00623"></a>00623                         draw_cells_pov(vl,fp);
<a name="l00624"></a>00624                 }<span class="comment"></span>
<a name="l00625"></a>00625 <span class="comment">                /** Computes all Voronoi cells and saves the output in POV-Ray</span>
<a name="l00626"></a>00626 <span class="comment">                 * format.</span>
<a name="l00627"></a>00627 <span class="comment">                 * \param[in] filename the name of the file to write to. */</span>
<a name="l00628"></a><a class="code" href="classvoro_1_1container__poly.html#ae949e1e7d3207212db3c99677e4906cd">00628</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__poly.html#ae949e1e7d3207212db3c99677e4906cd">draw_cells_pov</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *filename) {
<a name="l00629"></a>00629                         FILE *fp=safe_fopen(filename,<span class="stringliteral">&quot;w&quot;</span>);
<a name="l00630"></a>00630                         draw_cells_pov(fp);
<a name="l00631"></a>00631                         fclose(fp);
<a name="l00632"></a>00632                 }<span class="comment"></span>
<a name="l00633"></a>00633 <span class="comment">                /** Computes the Voronoi cells and saves customized information</span>
<a name="l00634"></a>00634 <span class="comment">                 * about them.</span>
<a name="l00635"></a>00635 <span class="comment">                 * \param[in] vl the loop class to use.</span>
<a name="l00636"></a>00636 <span class="comment">                 * \param[in] format the custom output string to use.</span>
<a name="l00637"></a>00637 <span class="comment">                 * \param[in] fp a file handle to write to. */</span>
<a name="l00638"></a>00638                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_loop&gt;
<a name="l00639"></a><a class="code" href="classvoro_1_1container__poly.html#a60907bce91cfacfa054a69872fb10ee3">00639</a>                 <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1container__poly.html#a60907bce91cfacfa054a69872fb10ee3">print_custom</a>(c_loop &amp;vl,<span class="keyword">const</span> <span class="keywordtype">char</span> *format,FILE *fp) {
<a name="l00640"></a>00640                         <span class="keywordtype">int</span> ijk,q;<span class="keywordtype">double</span> *pp;
<a name="l00641"></a>00641                         <span class="keywordflow">if</span>(contains_neighbor(format)) {
<a name="l00642"></a>00642                                 <a class="code" href="classvoro_1_1voronoicell__neighbor.html" title="Extension of the voronoicell_base class to represent a Voronoi cell with neighbor information...">voronoicell_neighbor</a> c;
<a name="l00643"></a>00643                                 <span class="keywordflow">if</span>(vl.start()) <span class="keywordflow">do</span> <span class="keywordflow">if</span>(compute_cell(c,vl)) {
<a name="l00644"></a>00644                                         ijk=vl.ijk;q=vl.q;pp=p[ijk]+ps*q;
<a name="l00645"></a>00645                                         c.<a class="code" href="classvoro_1_1voronoicell__base.html#a095c6bfc1b9b7a087d0b35b443e5c023">output_custom</a>(format,<span class="keywordtype">id</span>[ijk][q],*pp,pp[1],pp[2],pp[3],fp);
<a name="l00646"></a>00646                                 } <span class="keywordflow">while</span>(vl.inc());
<a name="l00647"></a>00647                         } <span class="keywordflow">else</span> {
<a name="l00648"></a>00648                                 <a class="code" href="classvoro_1_1voronoicell.html" title="Extension of the voronoicell_base class to represent a Voronoi cell without neighbor information...">voronoicell</a> c;
<a name="l00649"></a>00649                                 <span class="keywordflow">if</span>(vl.start()) <span class="keywordflow">do</span> <span class="keywordflow">if</span>(compute_cell(c,vl)) {
<a name="l00650"></a>00650                                         ijk=vl.ijk;q=vl.q;pp=p[ijk]+ps*q;
<a name="l00651"></a>00651                                         c.<a class="code" href="classvoro_1_1voronoicell__base.html#a095c6bfc1b9b7a087d0b35b443e5c023">output_custom</a>(format,<span class="keywordtype">id</span>[ijk][q],*pp,pp[1],pp[2],pp[3],fp);
<a name="l00652"></a>00652                                 } <span class="keywordflow">while</span>(vl.inc());
<a name="l00653"></a>00653                         }
<a name="l00654"></a>00654                 }<span class="comment"></span>
<a name="l00655"></a>00655 <span class="comment">                /** Computes the Voronoi cell for a particle currently being</span>
<a name="l00656"></a>00656 <span class="comment">                 * referenced by a loop class.</span>
<a name="l00657"></a>00657 <span class="comment">                 * \param[out] c a Voronoi cell class in which to store the</span>
<a name="l00658"></a>00658 <span class="comment">                 *               computed cell.</span>
<a name="l00659"></a>00659 <span class="comment">                 * \param[in] vl the loop class to use.</span>
<a name="l00660"></a>00660 <span class="comment">                 * \return True if the cell was computed. If the cell cannot be</span>
<a name="l00661"></a>00661 <span class="comment">                 * computed, if it is removed entirely by a wall or boundary</span>
<a name="l00662"></a>00662 <span class="comment">                 * condition, then the routine returns false. */</span>
<a name="l00663"></a>00663                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> v_cell,<span class="keyword">class</span> c_loop&gt;
<a name="l00664"></a><a class="code" href="classvoro_1_1container__poly.html#ae01c610b46aad0aae4998697b69a4b1c">00664</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1container__poly.html#ae01c610b46aad0aae4998697b69a4b1c">compute_cell</a>(v_cell &amp;c,c_loop &amp;vl) {
<a name="l00665"></a>00665                         <span class="keywordflow">return</span> vc.compute_cell(c,vl.ijk,vl.q,vl.i,vl.j,vl.k);
<a name="l00666"></a>00666                 }<span class="comment"></span>
<a name="l00667"></a>00667 <span class="comment">                /** Computes the Voronoi cell for given particle.</span>
<a name="l00668"></a>00668 <span class="comment">                 * \param[out] c a Voronoi cell class in which to store the</span>
<a name="l00669"></a>00669 <span class="comment">                 *               computed cell.</span>
<a name="l00670"></a>00670 <span class="comment">                 * \param[in] ijk the block that the particle is within.</span>
<a name="l00671"></a>00671 <span class="comment">                 * \param[in] q the index of the particle within the block.</span>
<a name="l00672"></a>00672 <span class="comment">                 * \return True if the cell was computed. If the cell cannot be</span>
<a name="l00673"></a>00673 <span class="comment">                 * computed, if it is removed entirely by a wall or boundary</span>
<a name="l00674"></a>00674 <span class="comment">                 * condition, then the routine returns false. */</span>
<a name="l00675"></a>00675                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> v_cell&gt;
<a name="l00676"></a><a class="code" href="classvoro_1_1container__poly.html#a12b9eeac5c7f409e1d75f77876c7bd3d">00676</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1container__poly.html#a12b9eeac5c7f409e1d75f77876c7bd3d">compute_cell</a>(v_cell &amp;c,<span class="keywordtype">int</span> ijk,<span class="keywordtype">int</span> q) {
<a name="l00677"></a>00677                         <span class="keywordtype">int</span> k=ijk/nxy,ijkt=ijk-nxy*k,j=ijkt/nx,i=ijkt-j*nx;
<a name="l00678"></a>00678                         <span class="keywordflow">return</span> vc.compute_cell(c,ijk,q,i,j,k);
<a name="l00679"></a>00679                 }
<a name="l00680"></a>00680                 <span class="keywordtype">void</span> print_custom(<span class="keyword">const</span> <span class="keywordtype">char</span> *format,FILE *fp=stdout);
<a name="l00681"></a>00681                 <span class="keywordtype">void</span> print_custom(<span class="keyword">const</span> <span class="keywordtype">char</span> *format,<span class="keyword">const</span> <span class="keywordtype">char</span> *filename);
<a name="l00682"></a>00682                 <span class="keywordtype">bool</span> find_voronoi_cell(<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z,<span class="keywordtype">double</span> &amp;rx,<span class="keywordtype">double</span> &amp;ry,<span class="keywordtype">double</span> &amp;rz,<span class="keywordtype">int</span> &amp;pid);
<a name="l00683"></a>00683         <span class="keyword">private</span>:
<a name="l00684"></a>00684                 <a class="code" href="classvoro_1_1voro__compute.html">voro_compute&lt;container_poly&gt;</a> vc;
<a name="l00685"></a>00685                 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classvoro_1_1voro__compute.html" title="Template for carrying out Voronoi cell computations.">voro_compute</a>&lt;<a class="code" href="classvoro_1_1container__poly.html" title="Extension of the container_base class for computing radical Voronoi tessellations.">container_poly</a>&gt;;
<a name="l00686"></a>00686 };
<a name="l00687"></a>00687 
<a name="l00688"></a>00688 }
<a name="l00689"></a>00689 
<a name="l00690"></a>00690 <span class="preprocessor">#endif</span>
</pre></div></div>
</div>


<hr class="footer"/><address class="footer"><small>
Generated on Fri Sep 23 2011 22:49:06 for Voro++ by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.5.1
</small></address>

</body>
</html>
